<script>
  const soureList = [
    {
      name: 'cp',
      user_id: 1001,
      age: 30
    },
    {
      name: 'dakang',
      user_id: 1002,
      age: 29
    }
  ]
  function toHump(key) {
    // 传入的是带有下滑线的 值
    // 特定字符转化  下划线转驼峰
    return key.replace(/\_(\w)/g, (all, letter) => {
      // console.log(all);  //得到的是下划线和下划线后的第一个值
      // console.log(letter); // 得到的是下划线后的第一个值
      // 通过toUpperCase()方法 转成大写  return出去大写的
      return letter.toUpperCase()
    })
  }
  function transData(souceData) {
    return souceData.map(item => {
      // 准备最后返回的对象
      let obj = {}
      // 通过Object.keys()获取到对象所有的键 所有的键遍历
      Object.keys(item).forEach(key => {
        // 如果键包含“_” 
        if (/\_(\w)/.test(key)) {
          // 如果需要转化 则进行驼峰转化
          // 定义一个变量名  得到带有下滑线的键 调用toHump方法 返回得到userId 赋值给定义的 _key
          let _key = toHump(key)
          // 把格式好的键 插入到定义的obj中  赋值还是soureList数组中对象中的值
          obj[_key] = item[key]
        } else {
          // 如果不需要直接赋值
          obj[key] = item[key]
        }
      })
      // 赋值完成的结果  return出去 一个对象
      return obj
    })
  }
  // 得到格式化好的数组
  const target = transData(soureList)
  console.log(target)

  // 数组中对象的age汇总
  function getAllAge(sourceList) {
    // 数组进行reduce()的方法 
    // 因为是对象求和 需要加初始值
    // a = 0 + c.age = 30   return给a = 30   
    // a = 30 + c.age = 29  return出去 59

    return sourceList.reduce((a, c) => a + c.age, 0)
  }
  // 调用一个方法 把数组传进去
  const allAge = getAllAge(soureList)
  console.log(allAge)

 
</script>